package cn.good.yan.b13;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;

/**
 * b13  网络编程
 *
 * @author shengren.yan
 * @create 2023-08-02
 */
public class Test {

    public static void main(String[] args) throws Exception {
        test1();
    }

    // TCP 、 UDP
    // TCP: 客户端、服务端 （3次捂手，3次连接、可以进行大量数据、效率低、安全）
    // UDP: 发送端、接受端（需要打包就发、发送端只管发，大小在64kb、速度快，看视频适合）
    public static void test1() throws Exception{
        // 获取 通信地址 参数：ip地址或域名
        InetAddress byName = InetAddress.getByName("www.baidu.com");
        System.out.println(byName); // 显示id地址
        // 获取IP地址
        System.out.println(byName.getHostAddress());
        // 获取域名
        System.out.println(byName.getHostName());
        // 获取本机的
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
    }

    // Socker - 客户端
    public static void test2() throws Exception{
        String str = "sss实际上";
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8080);
        OutputStream os = socket.getOutputStream();
        os.write(str.getBytes());
        socket.shutdownOutput(); // 通知服务端，已输出完毕
        // 接受服务端的反馈
        InputStream is = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = is.read(b))!=1){
            String s = new String(b, 0, len);
        }
        is.close();
        os.close();
        socket.close();
    }

    // Socker - 服务端
    public static void test3() throws Exception{
        ServerSocket ss = new ServerSocket(8080); // 参数 端口号
        // 处于阻塞状态，
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = is.read(b))!=1){
            String s = new String(b, 0, len);
        }
        //发送给客户端
        OutputStream os = socket.getOutputStream();
        os.write("成功接受".getBytes());
        os.close();
        is.close();
        socket.close();
    }

    // Socker - 客户端 - 发送文件
    public static void test4() throws Exception{
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8080);
        FileInputStream fis = new FileInputStream("文件地址");
        OutputStream os = socket.getOutputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = fis.read(b)) != 1) {
            os.write(b, 0, len);
        }
        socket.shutdownOutput(); // 通知服务端，已输出完毕
        // 接受服务端的反馈
        InputStream is = socket.getInputStream();
        while ((len = is.read(b))!=1){
            String s = new String(b, 0, len);
        }
        is.close();
        os.close();
        fis.close();
        socket.close();
    }


    // Socker - 服务端 - 接受文件
    public static void test5() throws Exception{
        ServerSocket ss = new ServerSocket(8080); // 参数 端口号
        // 处于阻塞状态，
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        FileOutputStream fo = new FileOutputStream("文件路径");
        byte[] b = new byte[1024];
        int len = 0;
        // 接受文件并保持到磁盘中 - 保持
        while ((len = is.read(b))!=1){
            fo.write(b,0,len);
        }
        //发送给客户端
        OutputStream os = socket.getOutputStream();
        os.write("成功接受".getBytes());
        os.close();
        fo.close();
        is.close();
        socket.close();
    }


    // UDP - 发送端
    public static void test6() throws Exception{
        String srt = "s是是是";
        DatagramSocket ds = new DatagramSocket();
        int i=0;
        while (i<=100){
            byte[] b = srt.getBytes();
            DatagramPacket dp = new DatagramPacket(b,0,b.length,InetAddress.getByName("127.0.0.1"),8080);
            ds.send(dp); // 发送
            i++;
        }
        ds.close();
    }

    // UDP - 接收端
    public static void test7() throws Exception{
        DatagramSocket ds = new DatagramSocket(8080);
        byte[] b = new byte[1024];
        int i=0;
        while (i<=100){
            DatagramPacket dp = new DatagramPacket(b,b.length);
            ds.receive(dp); // 接收
            System.out.println(new String(dp.getData(),0,dp.getLength()));
        }
        ds.close();
    }

    // URL - 编程
    public static void test8() throws Exception{
        URL url = new URL("http://127.0.0.1/xxx.txt");
        url.getProtocol();  // 获取该url的协议
        url.getHost();      // 获取主机名
        url.getPort();      // 获取端口号
        url.getPath();      // 获取url文件路径
        url.getFile();      // 获取该文件名
        url.getRef();       // 获取该文件相对路径
        url.getQuery();     // 获取的查询名  例如 ? 后面的参数
        InputStream inputStream = url.openStream(); // 得到输入流
        // URLConnection 与指定站点进行连接
        URLConnection urlConnection = url.openConnection();
        urlConnection.getInputStream(); // 获取输入流
        urlConnection.getOutputStream(); // 发送资源 - 向站点
    }

}
